package com.ml.nio.zerocopy;

import java.io.FileInputStream;
import java.net.InetSocketAddress;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;

/**
 * NIO 零拷贝案例 - 客户端
 * 案例要求：
 * 1) 使用传统的IO 方法传递一个大文件
 * 2) 使用NIO 零拷贝方式传递(transferTo，transferTo 底层使用到零拷贝)一个大文件
 * 3) 看看两种传递方式耗时时间分别是多少
 */
public class NewIOClient {

    public static void main(String[] args) throws Exception {
        String filename = "protoc-3.6.1-win32.zip";
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("localhost", 7001));
        //得到一个文件channel
        FileChannel fileChannel = new FileInputStream(filename).getChannel();

        //准备发送
        long startTime = System.currentTimeMillis();
        //在linux下一个transferTo 方法就可以完成传输
        //在windows 下一次调用 transferTo 只能发送8m , 就需要分段传输文件,
        //transferTo 底层使用到零拷贝
        long transferCount = fileChannel.transferTo(0, fileChannel.size(), socketChannel);
        System.out.println("发送的总的字节数 =" + transferCount + " 耗时:" + (System.currentTimeMillis() - startTime));

        //关闭
        fileChannel.close();
    }
}
